<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>apply</title>
</head>
<body>
    <script>
        /*
            func.apply(thisObj, 数组/伪数组)
            调用一个函数，用thisObj替换函数中的this，参数以数组或者伪数组的形式传递
            
            呼叫转移：调用一个函数，在内部调用另外一个函数，使用当前函数的this以及所有参数
        */

        var name = "战三";
        
        var obj = {
            name: "李白",
            sayName(){
                console.log(this.name);
            }
        }

        function sayLyric (str, strr) {
            console.log(this.name + " 唱:" + str + strr);
        }

        obj.sayName() // 李白
        obj.sayName.apply(); // 战三
        obj.sayName.apply(window) // 战三 

        sayLyric('离离原上草，', '一岁一枯荣'); // 战三唱：离离原上草，一岁一枯荣
        sayLyric.apply(['两只老虎', '跑得快']); // undefined 唱:undefinedundefined
        sayLyric.apply(obj, ['两只老虎,', '跑得快']) // 李白 唱:两只老虎,跑得快

        // 求不定参的和
        function sum(...args) {
            var count = 0;
            for (var i = 0; i < args.length; i++) {
                count += args[i]
            }
            return count;
        }

        // 求不定参的2倍和
        function sum2x(...args) {
            return 2*sum.apply(this, args);
        }
        console.log(sum2x(12,2));

        // 第一个参数作为倍数
        function sumx(...args) {
            // var n = args.shift()
            // return sum.apply(this, args) * n;

            // var n = Array.prototype.shift.call(arguments);
            var n = [].shift.call(arguments);
            return sum.apply(this, arguments) * n;
        }

        console.log(sumx(2,3,4)); // 14
        console.log(sumx(3,3,4)); // 21
    </script>
</body>
</html>